/**
 * 将指定格式的 字典定义，返回为一个包含value, 标识，描述的对象
 * value:[标识，描述]
 * 用法：
    export const TASK_STATUS= generateDicObj({
       0: ['unPub', '未发布','未发布描述'],
       1: ['pubbed', '已发布','已发布描述']
    })
    返回的TASK_STATUS 结构为
    {
        0: '未发布', // 返回描述值
        1: '已发布', // 返回描述值
        unPub: '0', // 返回标识
        pubbed: '1', // 返回标识
        _define: {unpub: '0', pubbed: '1'}, // 返回标识定义对象
        _tag: { 0: unpub, 1:pubbed}, // 返回对应标识对象
        _label: {0: '未发布', 1: '已发布'}  // 返回label对象
        _desc: {0: '未发布描述', 1: '已发布描述'}  // 返回描述对象
    }

    TASK_STATUS[0] >> 未发布
    TASK_STATUS[unPub] >> 0
    TASK_STATUS[_label] >> {0: '未发布', 1: '已发布'}
    TASK_STATUS[_desc] >> {0: '未发布描述', 1: '已发布描述'}
*/
function generateDicObj(obj) {
  const keyMap = new Map()
  const defineObj = {}
  const labelObj = {}
  const flagObj = {}
  const descObj = {}
  for (const key in obj) {
    const itemVal = obj[key]
    if (Array.isArray(itemVal) && itemVal.length > 0 && itemVal.length <= 3) {
      itemVal.forEach((item, idx) => {
        if (idx === 0) {
          keyMap.set(item, key)
          defineObj[item] = key
          flagObj[key] = item
        } else if (idx === 1) {
          keyMap.set(key, item)
          labelObj[key] = item
        } else if (idx === 2) {
          descObj[key] = item
        }
      })
    } else {
      throw Error('dict define invalid')
    }
  }

  const dictObj = {}
  for (const [key, value] of keyMap) {
    dictObj[key] = value
  }
  dictObj._define = defineObj
  dictObj._tag = flagObj
  if (Object.keys(labelObj).length > 0) {
    dictObj._label = labelObj
  }
  if (Object.keys(descObj).length > 0) {
    dictObj._desc = descObj
  }
  return Object.freeze(dictObj)
}

// 文件预览类型
export const FILE_PREVIEW_TYPE = generateDicObj({
  0: ['img', '图片'],
  1: ['doc', '文档'],
  2: ['video', '视频'],
})

// 自动保存状态
export const SAVING_STATUS = generateDicObj({
  0: ['init', '数据将自动保存'],
  1: ['saving', '正在保存'],
  2: ['success', '自动保存成功'],
  '-1': ['failed', '网络连接失败！'],
})

export const ORG_CODE_TYPE = 'ZBKH_ORG_TYPE'

// 指标类型
export const IND_TYPE = generateDicObj({
  2: ['lznl', '履职能力'],
  1: ['lzxg', '履职效果'],
})

// 指标类型
export const IND_PUSH_TYPE = generateDicObj({
  'XN-CODE001': ['push', '推送项'],
  'XN-CODE002': ['share', '共享项'],
  'XN-CODE003': ['pluses', '加分项'],
})

// 指标填报状态
export const INDICATION_STATUS = generateDicObj({
  0: ['notStart', '未开始'],
  1: ['init', '待填写'],
  2: ['delay', '逾期'],
  3: ['finished', '已完成'],
  4: ['delayFinished', '逾期完成'],
})

// 共享指标填报状态
export const INDICATION_SHARE_STATUS = generateDicObj({
  0: ['notStart', '未开始'],
  1: ['finished', '已完成'],
})

// 指标管理筛选状态
export const INDICATION_MANAGE_STATUS = generateDicObj({
  1: ['init', '推送中'],
  2: ['delay', '逾期'],
  3: ['finished', '已完成'],
})

// 指标管理筛选状态
export const INDICATION_FILTER_STATUS = generateDicObj({
  1: ['init', '推送中'],
  3: ['finished', '已完成'],
  '-1': ['invalid', '不符'],
})

// 指标填报表单类型
export const IND_POST_TYPE = generateDicObj({
  '1-1': ['text', '文本'],
  '1-2': ['date', '日期'],
  '1-3': ['file', '文件'],
  '1-4': ['rate', '评分'],
  '1-5': ['slider', '滑块'],
  '1-6': ['orgSelector', '选择单位'],
  '1-7': ['fromShare', '来自共享'],
  '1-8': ['fromShareInner', '表单内来自共享'],
})

// 指标管理-履职效果（共享指标）-筛选状态
export const IND_SHARE_PUSH_STATUS = generateDicObj({
  0: ['init', '待共享'],
  1: ['finished', '已完成'],
})

// 指标管理-确认提交类型
export const IND_SUBMIT_TYPE = generateDicObj({
  1: ['score', '考核评分'],
  2: ['report', '生成报告'],
})

// 指标填报表单类型
export const DATE_RANGE_TYPE = generateDicObj({
  1: ['month', '月份'],
  2: ['quarter', '季度'],
  3: ['year', '年'],
})

// 指标填报表单类型
export const IND_STEP_STATUS = generateDicObj({
  '-1': ['unPub', '未推送'],
  0: ['push', '推送中'],
  1: ['score', '评分中'],
  2: ['report', '生成报告'],
})

// 指标填报表单类型
export const IND_LVL_LABEL = generateDicObj({
  1: ['lv1', '一级指标'],
  2: ['lv2', '二级指标'],
  3: ['lv3', '三级指标'],
  4: ['lv4', '四级指标'],
  5: ['lv5', '五级指标'],
})

// 报告状态
export const IND_REPORT_STATUS = generateDicObj({
  0: ['init', '未生成'],
  1: ['built', '已生成'],
  2: ['building', '生成中'],
})

// TODO 修改为当前系统状态和描述
// 标识、描述类型字典常量
// 由绩效办工作人员发起
export const AUDIT_STATUS = generateDicObj({
  0: ['init', '待审核'],
  10: ['auditing', '审核中'],
  11: ['passed', '审核通过'],
  12: ['reject', '审核不通过'],
  // 0: ['init', '待提交'],
  // 11: ['submitted', '发起申请'],
  // 21: ['bzPassed', '部长审核'],
  // 22: ['bzReject', '部长审核'],
  // 31: ['zrPassed', '主任审核'],
  // 32: ['zrReject', '主任审核'],
  // 1: ['finished', '已办结'],
})

// 指标填报表单类型
export const IND_USER_OPT_TYPE = generateDicObj({
  '1-1': ['sharePush', '共享指标填报'],
  '1-2': ['scoreCheck', '分数校准'],
  '1-3': ['audit', '审核人员'],
})

// 操作日志类型
export const OPERATE_LOG_TYPE = generateDicObj({
  1: ['add', '新增内容'],
  2: ['del', '删除内容'],
  3: ['edit', '修改内容'],
  4: ['search', '查看内容'],
})
// 考核方案状态
export const IND_SCHEME_STATUS = generateDicObj({
  '-1': ['unpub', '未发布', '草稿'],
  0: ['pushing', '指标推送', '推送管理'],
  1: ['scoring', '分数校准', '确认分数'],
  2: ['reported', '报告审批', '审批'],
})

// 用户状态
export const USER_STATUS = generateDicObj({
  // 1: ['try', '试用'],
  // 2: ['onjob', '在职'],
  // 3: ['retire', '退休'],
  // 4: ['transfer', '调离'],
  // 5: ['expatriate', '外派'],
  // 6: ['depart', '离职'],
  2: ['onjob', '已启用'],
  6: ['depart', '已停用'],
})

// 用户状态
export const IND_LIB_CATEGORY_TYPE = generateDicObj({
  0: ['self', '自建指标'],
  1: ['system', '系统指标'],
})

// 文件类型
export const FILE_TYPE = generateDicObj({
  0: ['gztz', '工作通知'],
  4: ['zdwj', '制度文件'],
})
